﻿//给你一个整数数组 nums 和一个整数 x 。
//每一次操作时，你应当移除数组 nums 最左边或最右边的元素，然后从 x 中减去该元素的值。
//请注意，需要 修改 数组以供接下来的操作使用。
//
//如果可以将 x 恰好 减到 0 ，返回 最小操作数 ；否则，返回 - 1 。
//
//
//输入：nums = [1, 1, 4, 2, 3], x = 5
//输出：2
//解释：最佳解决方案是移除后两个元素，将 x 减到 0 。
//
//输入：nums = [5, 6, 7, 8, 9], x = 4
//输出： - 1
//
//输入：nums = [3, 2, 20, 1, 1, 3], x = 10
//输出：5
//解释：最佳解决方案是移除后三个元素和前两个元素（总共 5 次操作），将 x 减到 0 。
//
//提示：
//	1 <= nums.length <= 10^5
//	1 <= nums[i] <= 10^4
//	1 <= x <= 10^9


class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum = 0;
        for (int a : nums)
            sum += a;
        int target = sum - x;
        // 细节问题

        if (target < 0)
            return -1;
        int ret = -1;
        for (int left = 0, right = 0, tmp = 0; right < nums.size(); right++) {
            tmp += nums[right]; // 进窗⼝

            while (tmp > target) // 判断

                tmp -= nums[left++]; // 出窗⼝

            if (tmp == target) // 更新结果

                ret = max(ret, right - left + 1);
        }
        if (ret == -1)
            return ret;
        else
            return nums.size() - ret;
    }
};